SpringBoot 整合工作流Flowable 基础篇(一)

您所在的位置:网站首页 flowable execution SpringBoot 整合工作流Flowable 基础篇(一)

SpringBoot 整合工作流Flowable 基础篇(一)

#SpringBoot 整合工作流Flowable 基础篇(一)| 来源: 网络整理| 查看: 265

前言

工作流是啥,在这满天各种高并发的年代它就像个被遗弃的孤儿,不懂的小伙伴可以去提个OA流程体验一下,有机会可以去体检一下设计流程可以更好理解流程引擎,我暂时也没找到公开的流程设计体验网站(PS:找到就给大家分享)。

Flowable 是什么

Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。

Flowable 可以十分灵活地加入你的应用/服务/构架,也可以作为一个单独应用进行发布

搭建项目

创建一个 Springboot 项目,增加flowable依赖

org.flowable flowable-spring-boot-starter 6.7.2 启动前端项目

下载前端源码 flowable-vue

# 克隆项目 git clone https://gitee.com/Owater/flowable-vue.git # 进入项目目录 cd flowable-vue # 安装依赖 npm install --registry=https://registry.npmmirror.com # 启动服务 npm run dev 启动后端代码

下载后端代码

导入项目中 sql/demo_flowable.sql,运行DemoFlowableApplication即可

Flowable 数据库

Flowable的大部分数据库表以ACT_开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。

ACT_RE_: 'RE'代表repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。

ACT_RU_: 'RU'代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。

ACT_HI_: 'HI'代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。

ACT_GE_: 通用数据。在多处使用。

通用数据表(2个) act_ge_bytearray:二进制数据表,如流程定义、流程模板、流程图的字节流文件; act_ge_property:属性数据表(不常用); 历史表(8个,HistoryService接口操作的表) act_hi_actinst:历史节点表,存放流程实例运转的各个节点信息(包含开始、结束等非任务节点); act_hi_attachment:历史附件表,存放历史节点上传的附件信息(不常用); act_hi_comment:历史意见表; act_hi_detail:历史详情表,存储节点运转的一些信息(不常用); act_hi_identitylink:历史流程人员表,存储流程各节点候选、办理人员信息,常用于查询某人或部门的已办任务; act_hi_procinst:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例); act_hi_taskinst:历史流程任务表,存储历史任务节点; act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息; 用户相关表(4个,IdentityService接口操作的表) act_id_group:用户组信息表,对应节点选定候选组信息; act_id_info:用户扩展信息表,存储用户扩展信息; act_id_membership:用户与用户组关系表; act_id_user:用户信息表,对应节点选定办理人或候选人信息; 流程定义、流程模板相关表(3个,RepositoryService接口操作的表) act_re_deployment:部属信息表,存储流程定义、模板部署信息; act_re_procdef:流程定义信息表,存储流程定义相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储; act_re_model:流程模板信息表,存储流程模板相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储; 流程运行时表(6个,RuntimeService接口操作的表) act_ru_task:运行时流程任务节点表,存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用; act_ru_event_subscr:监听信息表,不常用; act_ru_execution:运行时流程执行实例表,记录运行中流程运行的各个分支信息(当没有子流程时,其数据与act_ru_task表数据是一一对应的); act_ru_identitylink:运行时流程人员表,重要,常用于查询人员或部门的待办任务时使用; act_ru_job:运行时定时任务数据表,存储流程的定时任务信息; act_ru_variable:运行时流程变量数据表,存储运行中的流程各节点的变量信息; 动态制定流程 设计流程

截图.png

实现逻辑:前端vue通过bpmn组件制定流程,生成xml,提交给后端,Flowable保存xml

// 保存流程bpmn Deployment deploy = repositoryService.createDeployment().addString("流程名称.bpmn", "流程生成的bpmn xml") .tenantId("租户id").name(req.getName()).category(req.getCategory()).deploy(); ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult(); repositoryService.setProcessDefinitionCategory(definition.getId(), "流程类别");

存储在act_re_procdef表

image.png

发起流程 // 查找对应的流程 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId("流程标识") .latestVersion().singleResult(); // 设置流程发起人Id到流程中 Map variables = new HashMap(); identityService.setAuthenticatedUserId("流程发起人ID"); variables.put(ProcessConstants.PROCESS_INITIATOR, "流程发起人ID"); runtimeService.startProcessInstanceById("流程标识", variables);

发起流程效果图:

发起流程效果

发起流程操作如下几张表数据:

ACT_HI_VARINST 存储流程历史变量表

ACT_HI_PROCINST 存储流程实例历史数据 image.png

ACT_HI_IDENTITYLINK 存储流程流转节点人员信息 image.png

ACT_HI_TASKINST 存储历史任务节点

ACT_RU_EXECUTION 存储运行中流程运行的各个分支信息

ACT_RU_ACTINST 存储运行中各个节点的详细信息,关联任务 image.png

ACT_RU_TASK 存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用

ACT_RU_IDENTITYLINK 存储运行中人员信息,常用于查询人员或部门的待办任务时使用

ACT_RU_VARIABLE 存储运行中的流程各节点的变量信息

审批流程 // 查找任务 Task task = taskService.createTaskQuery().taskId("任务ID").singleResult(); // 任务增加审批意见 taskService.addComment("任务ID", "流程实例Id", FlowComment.NORMAL.getType(), "审批意见"); // 设置审批人 用户ID taskService.setAssignee("任务ID", "审批人 用户ID"); taskService.complete("任务ID", "流程变量信息");

审批流程操作如下几张表数据:

insert into ACT_HI_VARINST:存储上一个节点操作数据 insert into ACT_HI_IDENTITYLINK:存储上一个节点人员信息 insert into ACT_HI_TASKINST:存储上一个节点任务数据 insert into ACT_HI_ACTINST insert into ACT_RU_ACTINST insert into ACT_RU_TASK:插入下一个节点任务 insert into ACT_GE_BYTEARRAY insert into ACT_RU_VARIABLE update ACT_RU_ACTINST:主要是更新REV_字段,主要用于实现乐观锁,可参考下面文章的解释 update ACT_RU_EXECUTION update ACT_HI_ACTINST update ACT_HI_TASKINST delete from ACT_RU_TASK:删除上个节点运行中的任务

Activiti 乐观锁实现过程

取消流程

实现逻辑:获取流程最后一个节点,改变节点状态

// 获取当前流程实例 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(req.getInstanceId()) .singleResult(); List executions = runtimeService.createExecutionQuery() .parentId(processInstance.getProcessInstanceId()).list(); // 所有的执行节点 List executionIds = new ArrayList(); executions.forEach(execution -> executionIds.add(execution.getId())); // 获取流程图 BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId()); Process process = bpmnModel.getMainProcess(); // 获取当前流程最后一个节点 String endId = endNodes.get(0).getId(); // 变更流程为已结束状态 runtimeService.createChangeActivityStateBuilder() .moveExecutionsToSingleActivityId(executionIds, endId).changeState(); 流程回退 // 查找任务 Task task = taskService.createTaskQuery().taskId("任务ID").singleResult(); // 回退操作 runtimeService.createChangeActivityStateBuilder() .processInstanceId(task.getProcessInstanceId()) .moveActivityIdsToSingleActivityId("需退回任务列表", "回退到指定节点的key").changeState(); 参考

RuoYi-flowable

flowable 数据库表结构



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3